/**
 * Axios封装工具调用示例
 * 展示各种请求方法、配置参数和特殊场景的使用方式
 */
import request from "./request"; // 导入封装好的请求工具

// ==============================================
// 1. 基础GET请求示例
// ==============================================
const fetchUserList = async () => {
  try {
    // 基础用法：只传URL
    const data = await request.get("/api/users");
    console.log("用户列表数据:", data);

    // 带查询参数的GET请求
    const filteredData = await request.get("/api/users", {
      params: {
        page: 1,
        size: 10,
        status: "active",
      },
    });
    console.log("分页用户数据:", filteredData);
  } catch (error) {
    console.error("获取用户列表失败:", error.message);
  }
};

// ==============================================
// 2. 基础POST请求示例
// ==============================================
const createUser = async () => {
  try {
    // 基础POST请求：提交表单数据
    const newUser = {
      name: "张三",
      age: 30,
      email: "zhangsan@example.com",
    };

    // 带自定义成功提示的POST请求
    const result = await request.post("/api/users", newUser, {
      successText: "用户创建成功！", // 自定义成功提示
      showSuccessTip: true, // 显式开启成功提示（默认就是true）
    });
    console.log("用户创建结果:", result);
  } catch (error) {
    console.error("创建用户失败:", error.message);
  }
};

// ==============================================
// 3. PUT和DELETE请求示例
// ==============================================
const updateAndDeleteDemo = async () => {
  const userId = 123;

  try {
    // PUT请求：更新资源
    const updateData = { name: "张三更新" };
    const updateResult = await request.put(`/api/users/${userId}`, updateData);
    console.log("更新结果:", updateResult);

    // DELETE请求：删除资源
    const deleteResult = await request.delete(`/api/users/${userId}`, {
      successText: "用户已成功删除",
    });
    console.log("删除结果:", deleteResult);
  } catch (error) {
    console.error("操作失败:", error.message);
  }
};

// ==============================================
// 4. 特殊配置示例
// ==============================================
const specialConfigDemo = async () => {
  try {
    // 跳过错误提示和成功提示
    const data1 = await request.get("/api/silent-data", {
      showSuccessTip: false, // 不显示成功提示
      skipErrorTip: true, // 不显示错误提示
    });

    // 跳过重复请求检查（允许相同请求并发）
    const data2 = await request.post(
      "/api/concurrent",
      { id: 1 },
      {
        skipDuplicateCheck: true,
      }
    );

    // 使用临时Token
    const data3 = await request.get("/api/protected-resource", {
      token: "临时的特殊Token", // 覆盖默认Token
    });

    // 自定义请求头
    const data4 = await request.get("/api/custom-header", {
      headers: {
        "X-Request-Source": "mobile",
        "X-Version": "1.0.0",
      },
    });
  } catch (error) {
    console.error("特殊请求失败:", error.message);
  }
};

// ==============================================
// 5. 二进制数据请求示例（下载文件等）
// ==============================================
const downloadFileDemo = async () => {
  try {
    // 请求二进制文件（如Excel、图片等）
    const blobData = await request.get("/api/export-excel", {
      responseType: "blob", // 指定响应类型为blob
      showSuccessTip: false, // 下载文件通常不需要成功提示
    });

    // 处理blob数据（创建下载链接）
    const url = window.URL.createObjectURL(new Blob([blobData]));
    const a = document.createElement("a");
    a.href = url;
    a.download = "用户数据.xlsx";
    document.body.appendChild(a);
    a.click();
    window.URL.revokeObjectURL(url);
  } catch (error) {
    console.error("文件下载失败:", error.message);
  }
};

// ==============================================
// 6. 错误节流控制示例
// ==============================================
const errorThrottleDemo = () => {
  // 关闭错误节流（所有错误都显示）
  request.errorThrottle.setInterval(0);

  // 调整节流间隔为5秒
  request.errorThrottle.setInterval(5000);

  // 清除特定错误的节流记录
  request.errorThrottle.clear("status-500");

  // 清除所有错误的节流记录
  request.errorThrottle.clearAll();
};

// ==============================================
// 7. 请求取消示例
// ==============================================
const cancelRequestDemo = async () => {
  // 方式1：使用manualKey手动指定标识，用于后续取消
  const fetchDataWithKey = async () => {
    try {
      const data = await request.get("/api/long-task", {
        manualKey: "long-task-request", // 手动指定标识
      });
      console.log("长任务结果:", data);
    } catch (error) {
      console.error("长任务处理失败:", error.message);
    }
  };

  // 启动请求
  fetchDataWithKey();

  // 500ms后取消请求
  setTimeout(() => {
    request.cancel("long-task-request");
    console.log("已取消长任务请求");
  }, 500);

  // 方式2：取消所有未完成的请求（如页面卸载时）
  const cancelAllRequests = () => {
    request.cancelAll();
    console.log("已取消所有请求");
  };

  // 模拟页面离开时取消所有请求
  window.addEventListener("beforeunload", cancelAllRequests);
};

// ==============================================
// 执行示例
// ==============================================
const runAllExamples = async () => {
  await fetchUserList();
  await createUser();
  await updateAndDeleteDemo();
  await specialConfigDemo();
  await downloadFileDemo();
  errorThrottleDemo();
  await cancelRequestDemo();
};

// 运行所有示例
runAllExamples();
